perm filename SYSFIX.FAI[SS,SYS]4 blob
sn#851606 filedate 1988-01-18 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 F A B C D E T TT TTT W X Y Z P CHKBEG DS LDISK DISKBF LPDL PDL ACWPRV DMPFIL FILE REENTA SYSFIX REENT2 NOFIXT NOPAT OLOOP TOOBIG INOK ILOOP NOFIX NODIFF SPCBEG SPCEND DIFF FIXNOW YORN YORN0 YORN2 YORN3 YORN4 OCTOUT OCTOU2 OCTOU4 OCTOU3 DECOUT SYMLUZ SETLUZ NOLOOK FERROR MAXERR FSCAN FSCAN1 FILNAM FSCAN2 FSCAN3 FCOPY GETSIX GETSX1 NOQUOT GETSX2 GETSX3 RADJ FERR1 FERR TYPFIL TYPSIX TYPSI1 TYPSI2
C00020 ENDMK
C⊗;
;⊗ F A B C D E T TT TTT W X Y Z P CHKBEG DS LDISK DISKBF LPDL PDL ACWPRV DMPFIL FILE REENTA SYSFIX REENT2 NOFIXT NOPAT OLOOP TOOBIG INOK ILOOP NOFIX NODIFF SPCBEG SPCEND DIFF FIXNOW YORN YORN0 YORN2 YORN3 YORN4 OCTOUT OCTOU2 OCTOU4 OCTOU3 DECOUT SYMLUZ SETLUZ NOLOOK FERROR MAXERR FSCAN FSCAN1 FILNAM FSCAN2 FSCAN3 FCOPY GETSIX GETSX1 NOQUOT GETSX2 GETSX3 RADJ FERR1 FERR TYPFIL TYPSIX TYPSI1 TYPSI2
TITLE SYSFIX Program to compare system core against version on disk.
.INSERT WATSIT[S,SYS] ;Define FTF2, etc.
F←0
A←1
B←2
C←3
D←4
E←5
T←6
TT←7 ;Must be T+1
TTT←←10 ;Clobberred by OCTOUT
W←13
X←14
Y←15
Z←16
P←17
CHKBEG←←223 ;LOWCORE loc pointing at CHKBEG
DS←←1
LDISK←←=18*200
DISKBF: BLOCK LDISK ;Space for data from disk version of system.
LPDL←←30
PDL: BLOCK LPDL
ACWPRV←←40 ;LH priv bit
LOC 124
REENTA ;Set up REENTER address
RELOC
DMPFIL: SIXBIT/WAITS/ ;Default DMP file holding system on disk
SIXBIT/DMP/
0
IFE FTF2,<SIXBIT/ SSYS/>
IFN FTF2,<SIXBIT/ 1 2/>
FILE: BLOCK 4 ;DMP file specified in command line
REENTA: SETOM FIXIT ;Flag reenter cmd, allow correcting system core
MOVSI A,1
GETPRV A, ;Get passive privs
TLNE A,ACWPRV ;Can this guy fix things?
JRST REENT2 ;Yes
SYSFIX: JFCL ;Allow for RPG startup
SETZM FIXIT# ;Not reentered, no fixing system
REENT2: RESET
MOVE P,[IOWD LPDL,PDL]
PUSHJ P,FSCAN ;Scan for filename, store in DMPFIL
SETZM NDIFFS# ;Number of differences found
SETZM NFIXES# ;Number of words fixed from file
OUTSTR [ASCIZ/Comparing protected part of system with /]
PUSHJ P,TYPFIL
OUTSTR [ASCIZ/.
Any differences will be typed out/]
SKIPN FIXIT
JRST NOFIXT
OUTSTR [ASCIZ/ and you will be able to selectively
correct core from /]
PUSHJ P,TYPFIL
OUTSTR [ASCIZ/, in the order presented here.
Type Y<cr> or <bucky>Y when prompted to correct the core location,
but do NOT type ahead/]
NOFIXT: OUTSTR [ASCIZ/.
/]
INIT DS,217
'DSK '
0
HALT .
MOVE Z,[DMPFIL,,W]
BLT Z,Z ;
LOOKUP DS,W
JRST NOLOOK
MOVSI A,ACWPRV
SKIPE FIXIT
SETPRV A, ;Enable
MOVSI A,377777
SKIPE FIXIT
TLZ A,1 ;Request write permission
SETPR2 A, ;MAP SYSTEM INTO UPPER SEGMENT
JRST SETLUZ
MOVE A,400000+CHKBEG ;Get address of start of checksummed part of system
MOVEI B,[RADIX50 0,PATCH↔0]
.SYML B, ;Get address of PATCH
MOVE B,A ;Undefined -- pretend PATCH is checksummed
MOVEM A,CHKB# ;Remember for difference checker, which will
MOVEM B,PAT# ;save PATCH address
OUTSTR [ASCIZ/(Also checking low core 200 through 377, except 346.)
/]
MOVEI T,200(B) ; ignore core between PATCH+200 and CHKBEG
MOVEM T,PATC#
CAMN A,B
JRST NOPAT ;No patch
OUTSTR [ASCIZ/(Also checking PATCH = /]
MOVEI T,(B)
PUSHJ P,OCTOUT
OUTSTR [ASCIZ/)
/]
NOPAT:
; MOVE A,B ;Start comparing at PATCH
MOVEI A,200 ;Start comparing in lowcor area
MOVEI B,[RADIX50 0,CHKEND↔0]
.SYML B, ;Get address of end of same
JRST SYMLUZ
MOVEM B,CHKE# ;remember ending address of checksummed portion
OUTSTR [ASCIZ/
/]
CAMGE B,SPCEND ;go beyond CHKEND if specially requested
MOVE B,SPCEND ;include some piece of system above CHKEND
CAIL B,400000 ;Better not run out of room in SETPR2 upper segment
JRST TOOBIG ;System is too big
;Now B has ending address of the scan
SUBI B,-1(A) ;Amount of system to be checksummed
OLOOP: MOVEI C,-74(A) ;Next disk word we want
LSH C,-7 ;Adjust to record number (minus 1)
USETI DS,1(C) ;Read file at right place
IN DS,[IOWD LDISK,DISKBF↔0] ;Read whole track
JRST INOK
OUTSTR [ASCIZ/Error reading disk file./]
EXIT 1,
JRST OLOOP ;Try again?
TOOBIG: OUTSTR [ASCIZ/CHKEND in system is 400000 or greater! Must adjust
SETPR2 bounds in SYSFIX and recompile it./]
EXIT
INOK: MOVEI C,-74(A) ;Next disk word we want
ANDI C,177 ;Offset within first record read
MOVNI D,(C) ;Negative of number of words skipped starting record
ADDI D,LDISK ;D is now words to check in this disk track
CAML D,B ;Want to check remainder of track?
MOVE D,B ;No, only check amount left in system
SUB B,D ;Amount remaining next time at OLOOP
MOVN D,D ;Negative amt this buffer
HRLZ D,D ;AOBJN ptr into disk buffer
HRR D,C ;Skip over some words maybe
ILOOP: MOVE E,400000(A) ;Get word from system
CAME E,DISKBF(D) ;Same as on disk?
PUSHJ P,DIFF ;No!
ADDI A,1 ;Next system address
AOBJN D,ILOOP ;Next buffer address
JUMPG B,OLOOP ;Jump if more system to examine
RELEAS DS,
INSKIP ;Clear ESC O
JFCL
SKIPN T,NDIFFS
JRST NODIFF ;No differences
OUTSTR [ASCIZ/
/]
PUSHJ P,DECOUT ;Print number of differences
OUTSTR [ASCIZ/ difference/]
MOVE T,NDIFFS
CAIE T,1
OUTCHR ["s"]
OUTSTR [ASCIZ/ found/]
SKIPN T,NFIXES ;Any fixed?
JRST NOFIX
OUTSTR [ASCIZ/, /]
PUSHJ P,DECOUT ;Print number of fixes
OUTSTR [ASCIZ/ fixed/]
NOFIX: OUTCHR ["."]
MOVSI A,1
GETPRV A, ;Get passive privs
TLNE A,ACWPRV ;Can this guy fix things?
OUTSTR [ASCIZ/
Type REENTER monitor command to be able to selectively fix clobberages./]
EXIT
NODIFF: OUTSTR [ASCIZ/No differences encountered./]
EXIT
SPCBEG: 0 ;set to first special address to check, above CHKEND.
SPCEND: 0 ;set to last address you want to check, if it's beyond CHKEND.
;We compare everything from 200 to CHKEND, but we suppress differences
;appearing: at 346, between 400 and PATCH, or between PATCH+200 and CHKBEG.
;Also, if SPCBEG and SPCEND are set up,
;we check the locations between them, inclusive.
DIFF: CAMGE A,SPCBEG ;ignore from CHKEND to any special block
CAMG A,CHKE
CAIA
POPJ P, ;ignore loc between CHKEND and DDT
CAMGE A,PAT ;ignore addresses between 400 and PATCH
CAIGE A,400
CAIN A,346 ;ignore this low core word that's change by RH init
POPJ P, ;ignore difference in inconstant data area
CAMGE A,CHKB ;Is this address between PATCH+200 and CHKBEG?
CAMGE A,PATC
AOSA NDIFFS ;Count a difference and show it
POPJ P, ;Yes, ignore this word (of data)
MOVEI T,(A) ;System address
PUSHJ P,OCTOUT ;Print octal address
OUTSTR [ASCIZ/[ /]]
HLRZ T,E ;System value
PUSHJ P,OCTOUT ;Print LH value from sys
OUTSTR [ASCIZ/,,/]
HRRZ T,E ;RH
PUSHJ P,OCTOUT ;Print RH value from sys
OUTSTR [ASCIZ/ should be /]
HLRZ T,DISKBF(D) ;LH
PUSHJ P,OCTOUT ;Print LH value from disk
OUTSTR [ASCIZ/,,/]
HRRZ T,DISKBF(D) ;RH
PUSHJ P,OCTOUT ;Print RH value from disk
OUTSTR [ASCIZ/ -- XOR is /]
XOR E,DISKBF(D) ;See what changed
HLRZ T,E ;XOR LH
PUSHJ P,OCTOUT ;Print LH value from XOR
OUTSTR [ASCIZ/,,/]
HRRZ T,E ;RH
PUSHJ P,OCTOUT ;Print RH value from XOR
SKIPE FIXIT
PUSHJ P,FIXNOW ;Maybe fix core if user wants
SKIPN FIXIT
OUTSTR [ASCIZ/
/]
POPJ P,
FIXNOW: OUTSTR [ASCIZ/ Fix?/]
PUSHJ P,YORN ;Yes or No
POPJ P, ;No
MOVE E,DISKBF(D) ;Get word from disk buffer
EXCH E,400000(A) ;Correct system (save old system value in case...)
AOS NFIXES ;Count fixes
POPJ P,
;Get Yes or No answer. Skip if Yes.
YORN: CLRBFI
INCHWL T ;Read a char from TTY
MOVE TT,T
ANDI TT,137 ;Flush bucky bits, make upper case
CAIN TT,"Y"
AOS (P)
YORN0: CAIE T,175 ;Altmode
TRNE T,600 ;Or bucky bits?
JRST YORN2 ;Yes, echo CRLF
CAIN T,12 ;LF
JRST YORN3 ;Yes, echo CR
CAIN T,15 ;CR
JRST YORN4 ;Yes, read LF
INCHWL T ;Skip to end of answer line
JRST YORN0
YORN2: OUTSTR [ASCIZ/
/]
POPJ P,
YORN3: OUTCHR [15] ;Echo CR after LF!
POPJ P,
YORN4: INCHWL T ;Read LF after CR
TRNE T,600 ;Bucky bits on LF?
JRST YORN2 ;Yes, echo CR
POPJ P,
OCTOUT: MOVEI TTT,6 ;Number of digits to print
OCTOU2: IDIVI T,10
PUSH P,TT
SUBI TTT,1 ;Count a digit going out
JUMPE T,OCTOU3
PUSHJ P,OCTOU2
OCTOU4: POP P,T
ADDI T,"0"
OUTCHR T
POPJ P,
OCTOU3: JUMPLE TTT,OCTOU4
MOVEI T,"0"
OUTCHR T
SOJA TTT,OCTOU3 ;Nice slow loop
DECOUT: IDIVI T,=10
PUSH P,TT
JUMPE T,.+2
PUSHJ P,DECOUT
POP P,T
ADDI T,"0"
OUTCHR T
POPJ P,
SYMLUZ: OUTSTR [ASCIZ/.SYML of CHKEND failed./]
EXIT
SETLUZ: OUTSTR [ASCIZ/SETPR2 failed./]
EXIT
NOLOOK: OUTSTR [ASCIZ/
LOOKUP failed -- /]
HRRZ X,X ;GET ERROR CODE
CAILE X,MAXERR
MOVEI X,MAXERR
OUTSTR @FERROR(X)
OUTSTR [ASCIZ/.
/]
JRST 4,SYSFIX
FERROR: [ASCIZ/No such file/]
[ASCIZ/No such PPN/]
[ASCIZ/Protection violation/]
[ASCIZ/File busy/]
MAXERR←←.-FERROR
[ASCIZ/Bad retrieval or other horrible error/]
;Routine to scan filename (or parts thereof) from command line, storing in
;DMPFIL. It is intentionally left unchanged by initialization, so that you
;can RUN SYSFIX;filename and then REENTER without retyping the name.
;(This code adapted from PPSAV.FAI[CSP,SYS] -- JJW 12/83)
FSCAN: RESCAN ;Rescan to look for a file name
FSCAN1: INCHWL A ;Flush to the semicolon
CAIN A,12 ;Or to LF
POPJ P, ;Use default name - no semi seen
CAIE A,";" ;Semicolon yet?
JRST FSCAN1 ;No, continue scanning
FILNAM: MOVE A,[DMPFIL,,FILE] ;Start with default filename
BLT A,FILE+3
PUSHJ P,GETSIX ;Get file name
JUMPE B,.+2 ;Use default if no filename
MOVEM B,FILE
CAIE A,"." ;Extension given?
JRST FSCAN2 ;No
PUSHJ P,GETSIX ;Get extension
HLLZM B,FILE+1 ;Store extension
FSCAN2: CAIE A,"[" ;PPN?
JRST FSCAN3 ;No
PUSHJ P,GETSIX ;Get PRJ
PUSHJ P,RADJ ;Right-adjust
HLLM B,FILE+3
CAIN A,12 ;OK to end after PRJ
JRST FCOPY
CAIE A,"," ;Else comma necessary
JRST FERR
PUSHJ P,GETSIX
PUSHJ P,RADJ
HLRM B,FILE+3
MOVEI B,0
CAIN A,"]"
PUSHJ P,GETSIX
JUMPN B,FERR
FSCAN3: CAIE A,12
JRST FERR
;After scanning filename without errors, copy into DMPFIL.
FCOPY: MOVE A,[FILE,,DMPFIL]
BLT A,DMPFIL+3
POPJ P,
GETSIX: SETZB B,QUOTF# ;Not yet quoting filename
MOVE C,[POINT 6,B]
GETSX1: INCHWL A
CAIL A,"A"+40
CAILE A,"Z"+40
JRST .+2
JRST GETSX3
CAIL A,"A"
CAILE A,"Z"
JRST .+2
JRST GETSX2
CAIN A,"↓"
JRST [ SETCMM QUOTF ;Complement quote flag
JRST GETSX1 ] ;Get next char
CAIE A,175 ;Altmode?
CAIGE A,40
JRST NOQUOT ;Can't quote impossible sixbit char (like CR,LF)
SKIPE QUOTF
JRST GETSX2 ;In quote mode, most any char is ok
NOQUOT: CAIE A,40
CAIN A,15
JRST GETSX1
CAIL A,"0"
CAILE A,"9"
POPJ P, ;Delimiter is any letter/digit
GETSX2: SUBI A," " ;Make sixbit
GETSX3: TLNE C,770000
IDPB A,C
JRST GETSX1
RADJ: JUMPE B,FERR1
TRNE B,-1
JRST FERR1
TLNE B,77
POPJ P,
LSH B,-6
JRST .-3
FERR1: POP P,(P)
FERR: CLRBFI
OUTSTR [ASCIZ/
Illegal file name. Try again: /]
JRST FILNAM
;Type filename stored in DMPFIL
TYPFIL: MOVE B,DMPFIL
PUSHJ P,TYPSIX
OUTCHR ["."]
HLLZ B,DMPFIL+1
PUSHJ P,TYPSIX
OUTCHR ["["]
HLLZ B,DMPFIL+3
PUSHJ P,TYPSIX
OUTCHR [","]
HRLZ B,DMPFIL+3
PUSHJ P,TYPSIX
OUTCHR ["]"]
POPJ P,
TYPSIX: MOVEI C,6
TYPSI1: LSHC A,6
ANDI A,77
JUMPE A,TYPSI2
ADDI A," "
OUTCHR A
TYPSI2: SOJG C,TYPSI1
POPJ P,
END SYSFIX